#ifndef CONTROLLER_H
#define CONTROLLER_H
#include "login.h"
#include "watcher.h"
#include "boxinit.h"
#include "MainD.h"
#include "userInformantion.h"
#include <QSystemTrayIcon>
#include <QAction>
#include <QMenu>
#include <QEvent>
#include <QIcon>
#include "aboutUs.h"
#include "gheaders.h"
#include <QErrorMessage>
#include "tcp_routines.h"
#include <QMap>
#include <QTextCodec>
#include <QFileInfoList>
#include "myMessageBox.h"
#include "warnning.h"
#include <QUrl>
#include <QDesktopServices>
#include "watting.h"


class Controller:public QDialog
{
    Q_OBJECT
private:
    int ctl_sock;                     //用于传输小包的socket
    int tsf_sock;                     //用于传输数据的sock
    QString userName;                 //用户名
    QString curDir;                    //程序当前工作目录
    QString settingFilePath;           //配置文件位置
    QString passwdFilePath;            //登录信息文件位置
    QString normalIconPath;              //程序普通状态下图标的位置
    QString upIconPath;                  //程序上传状态下图标的位置
    QString startIcon;                  //程序启动时候的启动图标
    QString homeDir;                   //用户主目录
    long useAge;                      //用来记录用户的空间使用率
    watcher* wt;                      //监视器线程
    Initer* BoxIniter;                //一个启动管理器，用于管理启动时候处理的事件
    Login* log;                       //登录窗口指针
    AboutUs* Ab;                      //关于我们指针
    Warnning* wn;
    ForceOffLine* FOL;
    Watting *wait;
    QTimer IconTimer;
    QTimer closeTimer;
    QTimer autoLogTimer;


    bool autoStart;
    bool iconUpdateFinished;
    MyMessageBox* MMg;
    UserInformation* UserInfo;
    QMap<QString,QString> initFliter; //处理函数用的map，用来过滤开始的日志


    QSystemTrayIcon* trayIcon;        //托盘图标
    QMenu* trayIconMenu;              //托盘菜单
    QAction* actionOpenHomeFodler;    //下面是托盘菜单中的事件
    QAction* actionOpenWeb;
    QAction* actionHelp;
    QAction* actionSuggestion;
    QAction* actionLogout;
    QAction* actionQuit;
    QAction* actionProcess;
    QAction* actionAboutUs;
    QAction* actionUserInformation;
    QAction* actionAutoStart;
    QMenu* moreMenu;
    void decode_path(const char* from, char* to);    //转换服务器与客户端之间的path
    void pull_file(const char* serverPath, const char *path);
    void autoLogin();//登录时请求文件
    void userExit(); //用户推出
    void rmDirFromMap(const char *);          //如果是删除一个文件夹事件，递归的将文件夹中在map（用于记录最后有那些文件要下载）中的
                                              //文件从map中删除
    void mvDirFromMap(const char *,const char *);  //  如果是移动一个文件夹事件，递归的将文件夹中在map（用于记录最后有那些文件要下载）中的
                                                   //文件进行重命名

    void setDirWriteable(QString dirName);         //将文件夹递归的加上可写权限，让用户可以操作
    void setDirReadOnly(QString dirName);          //将文件夹递归设置为只读，用户不能进行写操作
public:
    Controller();
    //static void  Quit(int);                                      //对退出事件或者程序异常终止事件进行
    int version;                      //版本号
    watcher* getWt()
    {return wt;}
    QString getHomeDir()
    {return homeDir;}
    //void closeEvent(QCloseEvent *event);
    //void changeEvent(QEvent *event);
public slots:
    void openHomeFodler();
    void logout();
    //void Quit();
    void process();
    void aboutUs();
    void openWeb();
    void help();
    void suggestion();
    void userInformation();
    void autoStartSetting();
    void iconActivated(QSystemTrayIcon::ActivationReason reason);
    void setIconUpdate(QString filename);             //设置图标为同步中
    void setIconFinished(QString filename);           //设置图标为同步完成
    void versionChanged();
    void Quit();                                     //用户正常退出进行的操作
    void init(int ctl_sock,QString UserName);        //初始化事件，接受tcp控制文件描述符和用户名作为参数
    void isUpdating();                               //设置托盘图标更新中
    void updateFinished();                           //更新文件完成，回复托盘图标
    void setTrayIconFinished();
    int dfs_rmdir(const char*);                     //递归删除文件夹函数
    void upVersionFile();
    void setEmblemForDir(QString);                 //给一个文件夹中的内容设置徽标
    void startWatcher();                           //接收到信号后，这个槽新建一个watcher对象开始用于监视
    void setVersion(int);                          //设置版本号
    void fileUpdating(QString);                    //文件正在更新中
    void fileUpdated(QString);
    void changeSize(long);
    void slotOverSize(QString);
    void quitRightOn();
    void logoutRightOn();
    void cancelQuit();
    void test();                                  //测试用的槽
    void ForceOffLineWatcher();
    void offline();
    void startWaittingDialog();
    void finishWaittingDialog();
    void startAutoLog();
};

#endif // CONTROLLER_H
